package com.ys.day28.socket通信方式;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 描述: P2半双工通信
 * 双向交替通信又称半双工通信，即通信的双方都可以发送信息，但不能双方同时发送，也不能同时接收。这种通信方式是相互的，一方发送，另一方接收。
 *
 * @author CodeYang
 * @version 2021/1/8 19:59
 */
public class P2半双工通信 {

    public static void main(String[] args) {
        new MyServer();
        new MyClient();
    }


}

/**
 * 半双工,可以输出,也可以输出,只是不能同时进行
 * 服务端:
 */
class MyServer {

    public MyServer() {

        try (
                // 注册服务 监听9999端口
                ServerSocket serverSocket = new ServerSocket(6535);
                // 阻塞,等待连接成功
                Socket accept = serverSocket.accept();
                InputStream is= accept.getInputStream();
                OutputStream os =accept.getOutputStream();
                // 半双工可以有输入流,也可以有输出流
                // 转换输入字节流
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));)
        {
            System.out.println("连接建立成功");
            System.out.println(accept);
            // 接收数据
            // 在redLine 读数据是写的时候要标志结束.
            String rst = reader.readLine();
            System.out.println("server接收到的的数据"+rst);

            System.out.println("服务端向客户端写信息---手动输入:");
            Scanner scanner = new Scanner(System.in);
            String data = scanner.nextLine();
            //server 向客户端 发送数据
            writer.write("servver info : "+data);
            // 标记结束写
            writer.newLine();
            writer.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        /**
         * 启动服务端
         */
        MyServer myServer = new MyServer();

    }

}

/**
 * 客户端 : 模拟半双工
 */
class MyClient {


    public MyClient() {
        try(
                //注册服务端  -建立连接
                Socket socket = new Socket("127.0.0.1",6535);
                // 输入流 读
                 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                 // 写
                 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
        )
         {
             System.out.println("向服务器发送请求信息->:");
             Scanner scanner = new Scanner(System.in);
             String data = scanner.nextLine();
             //    建立连接后写数据
             bufferedWriter.write("client info : "+data);
             // 当我们写数据过去,要写数据结束标志, 字符流的结束标志 可以使用 newLine ,字节流使用 -1 对象流可以自动判断
             bufferedWriter.newLine();
             bufferedWriter.flush();
             // 返回server响应的数据
             String reslut = bufferedReader.readLine();
             System.out.println(reslut);


         } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        /**
         * 启动客户端
         */
        MyClient myClient = new MyClient();
    }

}


